package com.shop.cereshop.app.utils;

import com.shop.cereshop.app.dao.buyer.CereBuyerUserDAO;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


@Component
public class NonNiceNumberGenerator {

    @Autowired
    CereBuyerUserDAO cereBuyerUserDAO;


    // 检查是否是靓号（需要避免的模式）
    private boolean isNiceNumber(String number) {
        // 1. 检查连续相同数字（如111, 2222等）
        for (int i = 0; i < number.length() - 2; i++) {
            if (number.charAt(i) == number.charAt(i + 1) && number.charAt(i) == number.charAt(i + 2)) {
                return true;

            }
        }

        // 2. 检查连续递增或递减（如123, 987等）
        boolean increasing = true;
        boolean decreasing = true;
        for (int i = 0; i < number.length() - 1; i++) {
            int current = Character.getNumericValue(number.charAt(i));
            int next = Character.getNumericValue(number.charAt(i + 1));

            if (next != current + 1) increasing = false;
            if (next != current - 1) decreasing = false;
        }
        if (increasing || decreasing) return true;

        // 3. 检查重复模式（如1212, 123123等）
        if (number.substring(0, 3).equals(number.substring(3))) {
            return true;
        }

        // 4. 检查特殊数字组合（如888, 666等）
        if (number.contains("888") || number.contains("666") || number.contains("999")) {
            return true;
        }

        // 5. 检查对称数字（如123321, 456654等）
        if (number.equals(new StringBuilder(number).reverse().toString())) {
            return true;
        }

        return false;
    }


    // 生成非靓号账号
    public String generateNonNiceNumbers(int count) {
        Random random = new Random();
        int maxAttempts = 0;
        final int MAX_ATTEMPTS = 10000; // 防止无限循环

        // 先生成足够的候选账号
        List<String> candidates = new ArrayList<>();
        while (candidates.size() < count * 10 && maxAttempts < MAX_ATTEMPTS) { // 生成10倍数量作为候选
            // 生成6位数
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 6; i++) {
                sb.append(random.nextInt(10));
            }
            String number = sb.toString();

            // 确保不是靓号
            if (!isNiceNumber(number)) {
                candidates.add(number);
            }
            maxAttempts++;
        }

        try {
            // 查询数据库中已存在的账号
            if (cereBuyerUserDAO != null && !candidates.isEmpty()) {
                List<String> existingAccounts = cereBuyerUserDAO.selectUserByAccount(candidates);


                // 从候选账号中移除已存在的账号
                candidates.removeAll(existingAccounts);
            }

            // 如果还有候选账号，返回第一个
            if (!candidates.isEmpty()) {
                return candidates.get(0);
            }
        } catch (Exception e) {
            System.err.println("数据库查询异常: " + e.getMessage());
            // 如果数据库查询失败，直接从候选账号中返回第一个
            if (!candidates.isEmpty()) {
                return null;
            }
        }

        return null; // 如果没有找到合适的账号，返回null
    }


}

